package com.zzz.offer.binaryOneNum;

public class BinaryOneNum {

    public static void main(String[] args) {
        System.out.println(new BinaryOneNum().NumberOf1(-10));
    }

    public int NumberOf1(int n) {
        int count = 0;
        // 1  32位 二进制表示  0000 0000  0000 0000  0000 0000  0000 0001
        // n  32位 二进制表示  0.。。。。。。11.。。。。。。0。。1.。。1.。。。0
        // 思路，让 n 与 1 相 与 运算 得到的结果为 1 说明 存在一个1
        //      将 n 进行无符号右移 1 位， 再让其 与 1 进行与运算。。这样就能知道 每位上是否有1
        //      因为 int 类型只有32 位，所以最多移动32位，就能知道有多少个1
        // 注意：
        //     这里必须要使用无符号移位运算  >>>  如果使用 >> 负数的高位为保留1，
        //     也就是说永远也无法将负数变成 全0状态
        while (n != 0) {
            if ((n & 1) == 1) {
                count++;
            }
            n = n >>> 1;
        }
        return count;
    }
}
